package br.com.lojapi.dao;

import br.com.lojapi.bean.Perfil;
import br.com.lojapi.bean.Usuario;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author Junior
 */
public class UsuarioDAOImp implements UsuarioDAO {

    @Override
    public Object salvar(Object obj) throws Exception {
        Usuario usuario = (Usuario) obj;
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        try {
            String SQL = "INSERT INTO usuario(nome,login, senha, email, idPerfil) "
                    + "VALUES(?, ?, ?, ?, ?)";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setString(1, usuario.getNome());
            ps.setString(2, usuario.getLogin());
            ps.setString(3, usuario.getSenha());
            ps.setString(4, usuario.getEmail());
            ps.setInt(5, usuario.getPerfil().getId());
            ps.executeUpdate();
        } catch (SQLException se) {
            throw new Exception("Erro ao tentar inserir dados" + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }
        return usuario;
    }

    @Override
    public void alterar(Object obj) throws Exception {
        Usuario usuario = (Usuario) obj;
        PreparedStatement ps = null;
        Connection conn = null;
        try {
            String SQL = "UPDATE usuario SET nome=?, login=?, senha=?, email=?,"
                    + " idPerfil=? WHERE id=?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setString(1, usuario.getNome());
            ps.setString(2, usuario.getLogin());
            ps.setString(3, usuario.getSenha());
            ps.setString(4, usuario.getEmail());
            ps.setInt(5, usuario.getPerfil().getId());
            ps.setInt(6, usuario.getId());
            ps.executeUpdate();
        } catch (SQLException se) {
            throw new Exception("Erro ao tentar atualizar dados" + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }
    }

    @Override
    public void excluir(int id) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        try {
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement("DELETE FROM usuario WHERE id = ?");
            ps.setInt(1, id);
            ps.executeUpdate();
        } catch (Exception e) {
            System.out.println("Erro ao excluir usuário: " + e.getMessage());
        }
    }

    @Override
    public Object procurar(Integer id) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        Usuario usuario = null;
        Perfil perfil;
        try {
            conn = FabricaConexao.getConnection();
            String consulta = "SELECT * FROM usuario usu JOIN perfil p "
                    + "ON usu.idPerfil = p.id WHERE usu.id = ?";
            ps = conn.prepareStatement(consulta);
            ps.setInt(1, id);
            rs = ps.executeQuery();
            if (rs.next()) {
                usuario = new Usuario();
                perfil = new Perfil();
                usuario.setId(rs.getInt("usu.id"));
                usuario.setNome(rs.getString("usu.nome"));
                usuario.setLogin(rs.getString("login"));
                usuario.setSenha(rs.getString("senha"));
                usuario.setEmail(rs.getString("email"));
                perfil.setId(rs.getInt("idPerfil"));
                perfil.setNome(rs.getString("p.nome"));
                perfil.setDescricao(rs.getString("descricao"));
                usuario.setPerfil(perfil);
            }
        } catch (Exception e) {
            System.out.println("Erro ao tentar procurar " + e.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }
        return usuario;
    }

    @Override
    public List<Object> listar() throws Exception {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public List<Usuario> procuraPorNome(String nome) throws SQLException, Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        Usuario usuario = null;
        Perfil perfil = null;
        List<Usuario> usuarios = new LinkedList();
        try {
            String pesquisa = "SELECT  u.*, pe.* FROM usuario u "
                    + "Join perfil pe ON u.idPerfil = pe.id WHERE u.nome like ?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(pesquisa);
            ps.setString(1, "%" + nome + "%");
            rs = ps.executeQuery();
            while (rs.next()) {
                usuario = new Usuario();
                perfil = new Perfil();
                usuario.setId(rs.getInt("u.id"));
                usuario.setNome(rs.getString("u.nome"));
                usuario.setLogin(rs.getString("login"));
                usuario.setSenha(rs.getString("senha"));
                usuario.setEmail(rs.getString("email"));
                perfil.setId(rs.getInt("idPerfil"));
                perfil.setNome(rs.getString("pe.nome"));
                perfil.setDescricao(rs.getString("descricao"));
                usuario.setPerfil(perfil);
                usuarios.add(usuario);
            }
        } catch (Exception e) {
            System.out.println("Erro ao procurar usuário " + e.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }
        return usuarios;
    }

    @Override
    public Usuario logar(String login, String senha) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        Usuario usuario = new Usuario();
        try {
            conn = FabricaConexao.getConnection();
            String consulta = "SELECT * FROM usuario "
                    + "WHERE login = ? AND senha = ?";
            ps = conn.prepareStatement(consulta);
            ps.setString(1, login);
            ps.setString(2, senha);
            rs = ps.executeQuery();
            if (rs.next()) {
                usuario.setLogado(true);
                usuario.setNome(rs.getString("nome"));
                usuario.setLogin(rs.getString("login"));
                usuario.setSenha(rs.getString("senha"));
            }
        } catch (Exception e) {
            System.out.println("Erro ao tentar logar " + e.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }
        return usuario;
    }
}